﻿using System;
using System.Collections.Generic;
using TPDiseño.Clases_de_Entidad;
using DAO.DataSetConsultoraTableAdapters;

namespace DAO
{
    public class DAOOp_Respuesta : DAO
    {
        //Atributos de manejo de instancia (singleton)
        static DAOOp_Respuesta instance = null;  
        // Atributos para acceso a los DataSet Tipados
        private DataSetConsultora.Op_RespuestaDataTable Op_RespuestaTabla = new DataSetConsultora.Op_RespuestaDataTable();
        private Op_RespuestaTableAdapter Op_RespuestaTableAdapter = new Op_RespuestaTableAdapter();
        // Dependencias de otros DAOs
        private DAOOp_PreguntaTieneResp_Pregunta miDAOOp_PreguntaTieneResp_Pregunta = DAOOp_PreguntaTieneResp_Pregunta.Instance;
        // Caches
        private Op_Respuesta cacheUna;
       
        public static DAOOp_Respuesta Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new DAOOp_Respuesta();
                        }
                    }
                }
                return instance;
            }
        }
        
        public Op_Respuesta guardar(Op_Respuesta unaOpcionDeRespuesta, int id_respuesta)
        {

            // Inserto la opcion de respuesta la db por medio de su correspodiente table adapter
            Op_RespuestaTableAdapter.Insertar(unaOpcionDeRespuesta._orden_visualizacion, 0, id_respuesta, unaOpcionDeRespuesta._descripcion);

            // Retorno la Opcion de respuesta insertada
            return recolectarUno();

        }

        public void actualizar(Op_Respuesta unaOpcionDeRespuesta){

            // Actualizo la Opcion de Respuesta en la db pro medio de su table adapter
            Op_RespuestaTableAdapter.Actualizar(unaOpcionDeRespuesta._orden_visualizacion, 0, unaOpcionDeRespuesta._descripcion, unaOpcionDeRespuesta._cod_op_respuesta);
        }


        public Op_Respuesta cargarUna(int cod_Op_Respuesta)
        {

           
            // Si no tengo una Opcion de respuesta
            if (cacheUna == null)
            {
                // Cargo las Op_Respuesta de la db
                Op_RespuestaTabla = Op_RespuestaTableAdapter.GetData();
                // Finalmente retorno un nuevo objeto Op_respuesta mapeado de la tabla    
                return recolectarUno();

                
            }
            // Si ya tengo una Opcion de respuesta
            else
            {
                // Solo retorno la preguta cacheada, evito ciclos y tener quer ir a la db
                return cacheUna;
            }
        }

        public List<Op_Respuesta> cargar(int cod_Respuesta, Pregunta unaPregunta)
        {
            // Cargo las Op_Respuesta de la db
            Op_RespuestaTabla = Op_RespuestaTableAdapter.consultarPorRespuesta(cod_Respuesta);

            // retorno las opciones de respuesta por medio de la funcion de recoleccion
            return recolectar(unaPregunta);
        }


        public List<Op_Respuesta> recolectar(Pregunta unaPregunta)
        {
            
            // Creo la lista para recolectar y devolver las Op_Respuestas Cargadas de la db
            List<Op_Respuesta> Op_RespuestasCargadas = new List<Op_Respuesta>();

            // Recorro las Op_Respuestas de la tabla
            foreach (DataSetConsultora.Op_RespuestaRow unaOp_RespuestaFila in Op_RespuestaTabla)
            {

                // Creo una Op_Respuesta y lo agrego a la lista de Op_Respuestas Cargadas
                Op_RespuestasCargadas.Add(new Op_Respuesta(unaOp_RespuestaFila.id,
                                                   unaOp_RespuestaFila.orden_visualizacion,
                                                   unaOp_RespuestaFila.descripcion,
                                                   miDAOOp_PreguntaTieneResp_Pregunta.cargarPorOp_Respuesta(unaOp_RespuestaFila.id, unaPregunta)
                                                   )
                                    );

            }

            // Finalmente devuelvo la lista de Op_RespuestasCargadas            
            return Op_RespuestasCargadas;
        }
        
        public Op_Respuesta recolectarUno()
        {
            // Devuelvo una unica pregunta mapeada de la tabla
            return new Op_Respuesta(Op_RespuestaTabla[0].id,
                                    Op_RespuestaTabla[0].orden_visualizacion,
                                    Op_RespuestaTabla[0].descripcion
                                    );


        }
    }
}
